這次的挑戰想讓自己成功堅持一件事情30天,我之前是個蠻3分鐘熱度的人,寫文章也總是很久才生出一篇覺得滿意的,比兩天捕魚三天曬網還誇張。
所以我這次我決定目標是每天都要有一定的產出,不要求一定要寫完整,以提高寫文章的效率。
可能文章會有寫錯或沒有把出處講完整的地方,或是中英混雜的太過嚴重,也可能系列文章安排順序沒有到很恰當,希望有看到文章的邦友,可以不吝指教,謝謝!
第一篇我想分享的是我學習到的,一套寫訓練模型比較有彈性的程式架構,而且也可以讓你後續要找實驗記錄比較容易的架構。
我待會會用Carvana的dataset,與brats 2019的dataset先概念解釋訓練的流程中,尤其是segmentation task 會需要做到哪些事?以及需要紀錄什麼?之後再逐一列出要做的功能,並且提供檔案要怎麼分開的建議,接著一樣用兩個datasets來實際寫一遍,說明程式碼的部分,與注意事項。
文章分段:
好的,就讓我們開始吧!
Carvana是一個有許多展示車子照片的dataset,來自kaggle平台,車子照片是.jpg。label是.gif,常見做法會將label轉成.jpg。pixel數值的部分是background為0,車子部分為255。dataset的取得需要登入kaggle及電話。
這個dataset的原始放置方式是,data放在單獨一個資料夾,label放在另一個資料夾,以檔名編號進行配對:
.
└── Carvana
├── train
| ├── 0001.jpg
| ├── 0002.jpg
| └── ...
└── train_masks
├── 0001_mask.gif
├── 0002_mask.gif
└── ...
▻ 2019年的比賽主頁,這年是由美國賓大的醫學佩雷爾曼學院主辦的樣子
brats比賽的data是mri影像,屬於醫學影像,因此它的取得需要提供資料及簽署使用同意書,原始資料是.nii.gz,是經過壓縮的nifti格式,不知道這種格式的可以把它簡單想成是儲存3d array的格式。brats是brain tumor segmentation的縮寫,他是專注於腦瘤分割的AI比賽。
label一樣是.nii.gz,從2018年開始,label的數值有變動,所以下載不同年度的data,記得去各年度網站確認label的數值。數值的部分一樣background為0,tumor、edema、還有缺氧壞死的部分各自編號1~4,我記得中間好像有跳號,具體原因不清楚。
這個dataset的原始放置方式是,先分成train和validation,再以tumor的grade區分為high和low,接著是以病患為單位,每個資料夾裡放了此病患的所有mri序列與label,validation的資料則沒有以tumor grade分開。
因為這種資料涉及病患隱私,所以各病患的資料會轉為一系列的代號,有興趣的人可以在查anonymization:
.
└── brats2019
├── Training
| ├── HGG/
| | ├── patient_1/
| | | ├── patient1_flair.nii.gz
| | | ├── patient1_seg.nii.gz
| | | ├── patient1_t1.nii.gz
| | | ├── patient1_t1ce.nii.gz
| | | └── patient1_t2.nii.gz
| | └── patient_2/
| | | └── ...
| | └── ...
| └── LGG/
| ├── patient_n/
| | └── ...
| └── ...
└── Validation
├── patient_m/
| └── ...
└── ...
模型訓練的第一步,是先了解你的task,要用哪種方式達成,是classification? detection? 還是segmentation等任務。
我今天要舉的兩個例子,都是segmentataoin任務,我想展示的是,不同的原始資料根據各自的特性處理完後,是如何透過同個流程進行訓練的。
Step 1 處理原始資料,分析資料
Step 2 根據各資料集的特性,把資料轉成tfrecord
Step 3 依照當初所轉的tfrecord的格式,將資料轉換回來
Step 4 將轉換的資料進行前處理
Step 5 擬定此次hyper parameter要設什麼
Step 6 準備空model,視情況將pre-trained weight載入
Step 7 根據此次訂定的hyper parameter去跑訓練
Step 8 紀錄訓練中的想記錄的情況
Step 9 將訓練的model或weight儲存及結果可視化
Step 10 再次準備空model,將訓練好的weight載入(或載入訓練好的model)
Step 11 直接將data輸入模型,產生output與label配對檢視
Step 12 根據task去選擇適合的metric,然後對訓練的model進行評分
其中一些步驟會有需要注意的事項:
像是據我目前所學知道的是,雖然目前有許多理論提出可以免除固定大小的input data,但在目前的框架像tensorflow、torch等,實作是不可行的。模型訓練用的資料分佈與真實場景的資料分布越一致,理論上應用的準確度和穩定性都會提升。而且一旦選定了input size,pretrained的weight也只能適用於同一input size,因此input size也算是hyper parameter之一,只是他常常有固定的常用size。
以上是Step 1 ~ 4需要注意的部分。
為了測試模型最適合的參數是什麼,在訓練時會去改動hyper parameter,像是loss的選用、learning rate的調整、train data的分佈、模型有沒有變形、使用backbone、data augmentation做了什麼,前處理做了什麼等等,有太多太多的參數需要紀錄,才能在分析模型時有清晰正確的實驗數據輔佐,而這些可能每一次都只有更動一項變數而已,為了實驗的流暢性,Step 5勢必要變成自動去紀錄,才能省下許多功夫。
而Step 8,也是重要的一環,很多時候,尤其是與他人合作,共用硬體資源時,不能如期地跑完完整的程式,因此程式除了做到在訓練完成時紀錄訓練資訊之外,最好是即使按下ctrl+c也能取得當前的訓練情形,並且有能力恢復中斷過的訓練。
目前能想到的大致上就是這樣,寫文章2跟3段就花了我3小時,之後的第4段和第5段就等明天再繼續接著吧。
感謝你的觀看,請不要吝嗇留下你的建言,讓還在學習的我能夠多開開眼界。
更正:
常見做法會將照片label
轉成.jpg
寫文章1跟2段2跟3段
之後的第3段和第4段第4段和第5段